package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.Habitacion;
import java.security.Timestamp;
import java.util.Date;
import java.sql.*;

import java.util.*;

public class HabitacionDAO {

    private static Connection con;
    public static List<Habitacion> disponibles;
    public static List<Habitacion> resultados;

    public static void crear(Habitacion habitacion) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException(" no hay conexion ");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into Habitacion values(?,?,?,?,?)");
            pst.setString(1, null);
            pst.setString(2, habitacion.getNumero());
            pst.setString(3, habitacion.getDistribucion());
            pst.setString(4, habitacion.getDescripcion());
            pst.setString(5, habitacion.getEstado() + "");
            pst.executeUpdate();


        } finally {

            if (pst != null) {
                pst.close();
            }
        }
    }

    public static Habitacion consultar(String numero) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        Habitacion habitacion = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Habitacion where numero = ?");
            pst.setString(1, numero);

            rs = pst.executeQuery();

            while (rs.next()) {
                habitacion = Habitacion.cargarDatos(rs);

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return habitacion;
        }
    }
    
    public static Habitacion consultarPorID(int id) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        Habitacion habitacion = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Habitacion where id = ?");
            pst.setInt(1, id);

            rs = pst.executeQuery();

            while (rs.next()) {
                habitacion = Habitacion.cargarDatos(rs);

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return habitacion;
        }
    }

    public static List listar(String numero) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Habitacion where numero like ?");
            pst.setString(1, "%" + numero + "%");

            rs = pst.executeQuery();

            while (rs.next()) {
                if (resultados == null) {
                    resultados = new LinkedList<Habitacion>();
                }
                resultados.add(Habitacion.cargarDatos(rs));

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static List consultarDisponibles(String distribucion) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        disponibles = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Habitacion where distribucion like ? or estado='a'");
            pst.setString(1, distribucion);
            rs = pst.executeQuery();


            while (rs.next()) {
                if (disponibles == null) {
                    disponibles = new LinkedList<Habitacion>();
                }
                disponibles.add(Habitacion.cargarDatos(rs));

            }

        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return disponibles;
        }
    }

    public static List consultarDisponiblesPorPeriodo(String distribucion, Date fechaInicial, Date fechaFinal) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        disponibles = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Select Habitacion.* from Habitacion inner join ReservaHabitacion on Habitacion.id != ReservaHabitacion.idHabitacion and	Habitacion.distribucion like ? and Habitacion.estado = 'a' and ?  between ReservaHabitacion.fechaProgIn and ReservaHabitacion.fechaProgOut and ? between ReservaHabitacion.fechaProgIn and ReservaHabitacion.fechaProgOut;");
            pst.setString(1, "%" + distribucion + "%");
            pst.setTimestamp(2, new java.sql.Timestamp(fechaInicial.getTime()));
            pst.setTimestamp(3, new java.sql.Timestamp(fechaFinal.getTime()));
            rs = pst.executeQuery();


            while (rs.next()) {
                if (disponibles == null) {
                    disponibles = new LinkedList<Habitacion>();
                }
                disponibles.add(Habitacion.cargarDatos(rs));

            }

        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return disponibles;
        }
    }

    public static void actualizar(Habitacion habitacion) throws SQLException, Exception {
        int id = habitacion.getId();

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update Habitacion Set numero=?,distribucion=?, descripcion=?,estado=? Where id=?");
            pst.setString(1, habitacion.getNumero());
            pst.setString(2, habitacion.getDistribucion());
            pst.setString(3, habitacion.getDescripcion());
            pst.setString(4, habitacion.getEstado() + "");
            pst.setInt(5, id);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static void eliminar(String numero) throws SQLException, Exception {
        if (consultar(numero) == null) {
            throw new SQLException("");
        }
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("delete from Habitacion where numero = ?");
            pst.setString(1, numero);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }
}
